"""
当有些操作需要在方法前后运行时, 可以放在前置和后置方法中
对一个测试用例的前置处理和后置处理, 需要实现特定的方法

通常在前置的方法里, 进行一些准备工作. 打开浏览器\打开页面\读取测试数据\连接数据库
通常在后置的方法里, 进行一些收尾工作. 关闭浏览器\关闭页面\删除测试数据\关闭数据库

控制级别：

一. 方法级别
使用方式：
前置处理:
def setup(self)              --> 首先自动执行
后置处理:
def teardown(self)           --> 最后自动执行

总结：运行于测试方法的始末，即：运行一次测试方法就会运行一次setup和teardown

二. 类级别
使用方式：
前置处理:
def setup_class(self):              --> 首先自动执行
后置处理:
def teardown_class(self):           --> 最后自动执行

总结：运行于测试类的始末，即：每个测试类只会运行一次setup_class和teardown_class
"""

# 假设现在测试登录, 会有以下5个步骤, 测试时, 要测试3种不同的测试数据组合
# 1. 打开浏览器   只需要打开1次
# 2. 打开登录页面  每次测试都需要执行. 执行3次, 需要打开3次
# 3. 执行测试, 输入用户名\密码\验证码\点击登录  核心的测试, 每次测试都要执行
# 4. 关闭登录页面  每次测试都需要执行. 执行3次, 需要打开3次
# 5. 关闭浏览器   只需要关闭1次


class TestLogin(object):
    def setup_class(self):
        print("\n1. 打开浏览器   只需要打开1次")

    def setup(self):
        print("2. 打开登录页面  每次测试都需要执行. 执行3次, 需要打开3次")

    def test_login1(self):
        print("3. 执行测试, 输入用户名\密码\验证码\点击登录  核心的测试, 每次测试都要执行")

    def test_login2(self):
        print("3. 执行测试, 输入用户名\密码\验证码\点击登录  核心的测试, 每次测试都要执行")

    def test_login3(self):
        print("3. 执行测试, 输入用户名\密码\验证码\点击登录  核心的测试, 每次测试都要执行")

    def teardown(self):
        print("4. 关闭登录页面  每次测试都需要执行. 执行3次, 需要打开3次")

    def teardown_class(self):
        print("5. 关闭浏览器   只需要关闭1次")